#pragma once
#ifndef MBDTreeNodeUITL_H
#define MBDTreeNodeUTIL_H

#include <string>
#include <vector>
#include <memory>

#include <fstream>
#include <sstream>
#include <stdexcept>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <mbdTreeNode.h>

// 添加nlohmann/json头文件
#include <json.hpp>
using json = nlohmann::json;

std::unique_ptr<TreeNode> jsonToTreeNode(const json &j) {
  try {
    auto node = std::make_unique<TreeNode>();

    // 安全地访问和转换字符串属性
    if (j.contains("key") && j["key"].is_string()) {
      node->key = j["key"].get<std::string>();
    }
    if (j.contains("value") && j["value"].is_string()) {
      node->value = j["value"].get<std::string>();
    }
    if (j.contains("nodeName") && j["nodeName"].is_string()) {
      node->nodeName = j["nodeName"].get<std::string>();
    }
    if (j.contains("valueType") && j["valueType"].is_number_integer()) {
      node->valueType = static_cast<ValueType>(j["valueType"].get<int>());
    }

    // 递归处理子节点
    if (j.contains("childNodes") && j["childNodes"].is_array()) {
      for (const auto &child : j["childNodes"]) {
        auto childNode = jsonToTreeNode(child);
        if (childNode) {
          node->childNodes.push_back(std::move(childNode));
        }
      }
    }

    return node;
  } catch (const std::exception &e) {
    std::cerr << "转换JSON到TreeNode时出错: " << e.what() << std::endl;
    return nullptr;
  }
}

//// 从字符串解析JSON的重载版本
std::unique_ptr<TreeNode> jsonToTreeNode(const std::string &jsonStr) {
  try {
    json j = json::parse(jsonStr);
    return jsonToTreeNode(j);
  } catch (const json::exception &e) {
    std::cerr << "JSON解析错误: " << e.what() << std::endl;
    return nullptr;
  }
}

// 从文件加载JSON并转换为TreeNode的辅助函数
std::unique_ptr<TreeNode>
loadTreeNodeFromJsonFile(const std::string &filePath) {
  try {
    std::ifstream file(filePath);
    if (!file.is_open()) {
      std::cerr << "无法打开文件进行读取: " << filePath << std::endl;
      return nullptr;
    }

    // 使用nlohmann/json直接从文件流解析
    json j;
    file >> j;
    file.close();

    return jsonToTreeNode(j);
  } catch (const std::exception &e) {
    std::cerr << "从文件加载JSON失败: " << e.what() << std::endl;
    return nullptr;
  }
}

#endif